package com.fourool.goodsmall.service.impl;

import com.fourool.goodsmall.common.Result;
import com.fourool.goodsmall.dto.UpdateInfoDTO;
import com.fourool.goodsmall.dto.RegisterDTO;
import com.fourool.goodsmall.entity.GPerson;
import com.fourool.goodsmall.mapper.GPersonMapper;
import com.fourool.goodsmall.service.GPersonService;
import com.fourool.goodsmall.service.SmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.concurrent.ThreadLocalRandom;

@Service
public class GPersonServiceImpl implements GPersonService {

    @Autowired
    private GPersonMapper personMapper;

    @Autowired
    private SmsService smsService;

    @Override
    @Transactional
    public Result register(RegisterDTO dto) { // 参数改为DTO
        // 1. 校验验证码
        if (!smsService.verifyCode(dto.getPhone(), dto.getCode())) {
            return Result.error(400, "验证码错误或已过期");
        }

        // 2. 检查手机号是否已被注册
        if (personMapper.findByPhone(dto.getPhone()) != null) {
            return Result.error(400, "该手机号已被注册");
        }

        // 3. 处理邀请码逻辑
        Integer inviterId = null;
        if (dto.getInvitationCode() != null && !dto.getInvitationCode().trim().isEmpty()) {
            GPerson inviter = personMapper.findByInvitationCode(dto.getInvitationCode());
            if (inviter == null) {
                return Result.error(400, "无效的邀请码");
            }
            inviterId = inviter.getId();
            // 可以在这里给邀请人增加积分等奖励
             GPerson updatedInviter = new GPerson();
             updatedInviter.setId(inviterId);
             updatedInviter.setRecord(inviter.getRecord() + 100); // 比如奖励100积分
             personMapper.updateRecord(updatedInviter);
        }

        // 4. 创建新用户对象
        GPerson person = new GPerson();
        person.setPhone(dto.getPhone());
        person.setPassword(dto.getPassword());
        person.setName("新用户" + dto.getPhone().substring(7));
        person.setInviterId(inviterId); // 设置邀请人ID

        // 5. 插入数据库
        personMapper.insert(person);

        // 6. 为新用户生成一个唯一的邀请码 (插入后才能获取到新用户的ID)
        // 这里用 "U" + ID + 随机三位数 的方式生成
        String newInvitationCode = "U" + person.getId() + ThreadLocalRandom.current().nextInt(100, 1000);
        GPerson updateCodePerson = new GPerson();
        updateCodePerson.setId(person.getId());
        updateCodePerson.setInvitationCode(newInvitationCode);
        personMapper.update(updateCodePerson);

        return Result.success();
    }

    @Override
    public Result login(String phone, String password) {
        // 1. 根据手机号查询用户
        GPerson person = personMapper.findByPhone(phone);
        if (person == null) {
            return Result.error(404, "用户不存在");
        }

        // 2. 校验密码
        // TODO 应比较加密后的密码
        if (!password.equals(person.getPassword())) {
            return Result.error(400, "密码错误");
        }

        // 3. 登录成功，返回用户信息
        // 为了安全，不应该返回密码
        person.setPassword(null);
        return Result.success(person);
    }

    @Override
    public Result getUserInfo(Integer id) {
        GPerson person = personMapper.findById(id);
        if (person == null) {
            return Result.error(404, "用户不存在");
        }
        person.setPassword(null);
        return Result.success(person);
    }

    @Override
    @Transactional // 修改操作，建议加上事务
    public Result updateUserInfo(Integer pid, UpdateInfoDTO dto) {
        // 1. 检查用户是否存在
        GPerson currentUser = personMapper.findById(pid);
        if (currentUser == null) {
            return Result.error(404, "用户不存在");
        }

        // 2. 处理手机号修改逻辑
        String newPhone = dto.getPhone();
        // 如果传入了新的、且与当前不同的手机号
        if (newPhone != null && !newPhone.trim().isEmpty() && !newPhone.equals(currentUser.getPhone())) {

            // a. 必须提供验证码
            if (dto.getCode() == null || dto.getCode().trim().isEmpty()) {
                return Result.error(400, "修改手机号需要提供验证码");
            }

            // b. 校验新手机号的验证码
            if (!smsService.verifyCode(newPhone, dto.getCode())) {
                return Result.error(400, "新手机号的验证码错误或已过期");
            }

            // c. 检查新手机号是否已被其他用户占用
            if (personMapper.findByPhone(newPhone) != null) {
                return Result.error(400, "该手机号已被其他用户绑定");
            }

            // d. 更新手机号
            currentUser.setPhone(newPhone);
        }

        // 3. 处理其他信息的更新
        if (dto.getName() != null) {
            currentUser.setName(dto.getName());
        }
        if (dto.getAvatar() != null) {
            currentUser.setAvatar(dto.getAvatar());
        }

        // 4. 执行更新数据库操作
        personMapper.update(currentUser);

        // 5. 返回更新后的完整信息
        return getUserInfo(pid);
    }
}